19173
11074
Hvad er den hurtigste metode til at konvertere en java.nio.ByteBuffer a til en (nyoprettet) CharBuffer b eller char [] b.
Ved at gøre dette er det vigtigt, at a [i] == b [i]. Dette betyder, at ikke en [i] og en [i + 1] sammen udgør en værdi b [j], hvad getChar (i) ville gøre, men værdierne skal "spredes".
byte a [] = {1,2,3, 125,126,127, -128, -127, -126} // hver en byte (som er underskrevet)
char b [] = {1,2,3, 125,126,127, 128, 129, 130} // hver en char (som ikke er underskrevet)
Bemærk, at byte: -128 har de samme (nederste 8) bits som char: 128. Derfor antager jeg, at den "bedste" fortolkning ville være, som jeg bemærkede det ovenfor, fordi bitene er de samme.
Derefter har jeg også brug for omvendt oversættelse: Den mest effektive måde at få en char [] eller java.nio.CharBuffer tilbage til en java.nio.ByteBuffer. 
Så hvad du ønsker er at konvertere ved hjælp af kodningen ISO-8859-1.
Jeg hævder ikke noget om effektivitet, men i det mindste er det ganske kort at skrive:
CharBuffer-resultat = Charset.forName ("ISO-8859-1"). Afkode (byteBuffer);
Den anden retning ville være:
ByteBuffer-resultat = Charset.forName ("ISO-8859-1"). Kode (charBuffer);
Mål dette mod andre løsninger. (For at være retfærdig bør Charset.forName-delen ikke medtages, og den skal også kun udføres en gang, ikke for hver buffer igen.)
Fra Java 7 er der også StandardCharsets-klassen med forinstanserede Charset-forekomster, så du kan bruge
CharBuffer-resultat = StandardCharsets.ISO_8859_1.decode (byteBuffer);
og
ByteBuffer-resultat = StandardCharsets.ISO_8859_1.encode (charBuffer);
i stedet. (Disse linjer gør det samme som dem før, bare opslag er lettere, og der er ingen risiko for at indtaste navnene forkert og ikke nødvendigt at fange de umulige undtagelser.)
|
Jeg er enig med @ Ishtar, foreslår at undgå at konvertere til en ny struktur overhovedet og kun konvertere efter behov.
Men hvis du har en bunke ByteBuffer, kan du gøre.
ByteBuffer bb = ...
byte [] array = bb.array ();
char [] chars = ny char [bb.resterende ()];
for (int i = 0; i